package com.leetcode.根据算法进行分类.滑动窗口相关;

/**
 * @author: xiaomi
 * @date: 2021/2/8
 * @description: 978. 最长湍流子数组
 * https://leetcode-cn.com/problems/longest-turbulent-subarray/
 * 这道题想出来一个双指针的框架是不难的，比较麻烦的是细节的一些处理。
 * -> 那么可以拿出一个例子，出来演绎一下！然后再去写伪代码！
 */
public class B_978_最长湍流子数组 {

	public static void main(String[] args) {
		B_978_最长湍流子数组 action = new B_978_最长湍流子数组();
		test1(action);
		test2(action);
	}


	public static void test1(B_978_最长湍流子数组 action) {
		//5
		int[] nums = new int[]{9, 4, 2, 10, 7, 8, 8, 1, 9};
		int res = action.maxTurbulenceSize(nums);
		System.out.println("res = " + res);
	}

	public static void test2(B_978_最长湍流子数组 action) {
		//6
		int[] nums = new int[]{2, 0, 2, 4, 2, 5, 0, 1, 2, 3};
		int res = action.maxTurbulenceSize(nums);
		System.out.println("res = " + res);
	}

	/**
	 * 这个似乎只能用 sliding windows
	 *
	 * @param arr
	 * @return
	 */
	public int maxTurbulenceSize(int[] arr) {
		//1.边界判断
		int len = arr.length;
		if (len == 1) {
			return len;
		}
		//2.使用 sliding windows 进行
		int begin = 0, end = 1;
		int res = 0;
		//flag = true -> 要求 end > end-1;否则 end < end-1
		// 使用 flag 不能区分 > = < 三种状态，于是还是用 short 吧，但是加减后的结果默认是 int ，那就算了还是用int 吧
		//boolean flag = true;
		int lastFlag = arr[end] == arr[begin] ? 0 : (arr[end] > arr[begin] ? -1 : 1);
		int flag = -1;
		begin = lastFlag == 0 ? 1 : 0;
		end++;
		res = end - begin;
		//2.1 初始化 -> 找到第一个的值
		while (end < len) {
			flag = arr[end] == arr[end - 1] ? 0 : (arr[end] > arr[end - 1] ? -1 : 1);
			if ((lastFlag == 1 && flag == -1) || (lastFlag == -1 && flag == 1)) {
				end++;
				res = Math.max(res, end - begin);
			} else {
				begin = end++ - 1;
			}
			lastFlag = flag;
		}
		return res;

	}
}
